From 5afb4f0f116f0e8a200dd55cc6688a957b4d397c Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Wed, 8 Mar 2006 17:02:34 +0000 Subject: [PATCH] gdk/gdkscreen.h gdk/x11/gdkscreen-x11.c added 2006-03-08 Michael Natterer * gdk/gdkscreen.h * gdk/x11/gdkscreen-x11.c * gdk/gdk.symbols: added gdk_screen_get_active_window() and gdk_screen_get_window_stack() (patch from maemo-gtk). Fixes bug #320881. * gdk/directfb/gdkscreen-directfb.c * gdk/quartz/gdkscreen-quartz.c * gdk/win32/gdkscreen-win32.c: added the functions as stubs. --- ChangeLog | 12 +++ ChangeLog.pre-2-10 | 12 +++ gdk/directfb/gdkscreen-directfb.c | 15 ++++ gdk/gdk.symbols | 2 + gdk/gdkscreen.h | 3 + gdk/quartz/gdkscreen-quartz.c | 16 ++++ gdk/win32/gdkscreen-win32.c | 16 ++++ gdk/x11/gdkscreen-x11.c | 144 ++++++++++++++++++++++++++++++ 8 files changed, 220 insertions(+) diff --git a/ChangeLog b/ChangeLog index 98237a68da..d80e3be0fb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2006-03-08 Michael Natterer + + * gdk/gdkscreen.h + * gdk/x11/gdkscreen-x11.c + * gdk/gdk.symbols: added gdk_screen_get_active_window() and + gdk_screen_get_window_stack() (patch from maemo-gtk). + Fixes bug #320881. + + * gdk/directfb/gdkscreen-directfb.c + * gdk/quartz/gdkscreen-quartz.c + * gdk/win32/gdkscreen-win32.c: added the functions as stubs. + 2006-03-08 Michael Natterer * tests/prop-editor.c (unichar_changed): zero-initialize the diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 98237a68da..d80e3be0fb 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,15 @@ +2006-03-08 Michael Natterer + + * gdk/gdkscreen.h + * gdk/x11/gdkscreen-x11.c + * gdk/gdk.symbols: added gdk_screen_get_active_window() and + gdk_screen_get_window_stack() (patch from maemo-gtk). + Fixes bug #320881. + + * gdk/directfb/gdkscreen-directfb.c + * gdk/quartz/gdkscreen-quartz.c + * gdk/win32/gdkscreen-win32.c: added the functions as stubs. + 2006-03-08 Michael Natterer * tests/prop-editor.c (unichar_changed): zero-initialize the diff --git a/gdk/directfb/gdkscreen-directfb.c b/gdk/directfb/gdkscreen-directfb.c index a18cc2c1f4..5eb1384bd4 100644 --- a/gdk/directfb/gdkscreen-directfb.c +++ b/gdk/directfb/gdkscreen-directfb.c @@ -196,6 +196,21 @@ gdk_screen_get_rgba_colormap (GdkScreen *screen) return rgba_colormap; } +GdkWindow * +gdk_screen_get_active_window (GdkScreen *screen) +{ + g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL); + + return NULL; +} + +GList * +gdk_screen_get_window_stack (GdkScreen *screen) +{ + g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL); + + return NULL; +} #define __GDK_SCREEN_X11_C__ diff --git a/gdk/gdk.symbols b/gdk/gdk.symbols index c628388e08..9f381a5e6e 100644 --- a/gdk/gdk.symbols +++ b/gdk/gdk.symbols @@ -1039,6 +1039,8 @@ gdk_screen_get_n_monitors gdk_screen_get_monitor_geometry gdk_screen_get_rgba_colormap gdk_screen_get_rgba_visual +gdk_screen_get_active_window +gdk_screen_get_window_stack gdk_screen_make_display_name #endif #endif diff --git a/gdk/gdkscreen.h b/gdk/gdkscreen.h index 620fca71ce..3b6624b687 100644 --- a/gdk/gdkscreen.h +++ b/gdk/gdkscreen.h @@ -110,6 +110,9 @@ void gdk_screen_set_resolution (GdkScreen *screen, gdouble dpi); gdouble gdk_screen_get_resolution (GdkScreen *screen); +GdkWindow *gdk_screen_get_active_window (GdkScreen *screen); +GList *gdk_screen_get_window_stack (GdkScreen *screen); + G_END_DECLS #endif /* __GDK_SCREEN_H__ */ diff --git a/gdk/quartz/gdkscreen-quartz.c b/gdk/quartz/gdkscreen-quartz.c index f23eba227e..3aadebd063 100644 --- a/gdk/quartz/gdkscreen-quartz.c +++ b/gdk/quartz/gdkscreen-quartz.c @@ -239,3 +239,19 @@ gdk_screen_make_display_name (GdkScreen *screen) { return g_strdup (gdk_display_get_name (_gdk_display)); } + +GdkWindow * +gdk_screen_get_active_window (GdkScreen *screen) +{ + g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL); + + return NULL; +} + +GList * +gdk_screen_get_window_stack (GdkScreen *screen) +{ + g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL); + + return NULL; +} diff --git a/gdk/win32/gdkscreen-win32.c b/gdk/win32/gdkscreen-win32.c index 24a3094103..0bf47e3dcf 100644 --- a/gdk/win32/gdkscreen-win32.c +++ b/gdk/win32/gdkscreen-win32.c @@ -117,3 +117,19 @@ gdk_screen_make_display_name (GdkScreen *screen) { return g_strdup (gdk_display_get_name (_gdk_display)); } + +GdkWindow * +gdk_screen_get_active_window (GdkScreen *screen) +{ + g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL); + + return NULL; +} + +GList * +gdk_screen_get_window_stack (GdkScreen *screen) +{ + g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL); + + return NULL; +} diff --git a/gdk/x11/gdkscreen-x11.c b/gdk/x11/gdkscreen-x11.c index 63a69ae632..f9cfc8cdb8 100644 --- a/gdk/x11/gdkscreen-x11.c +++ b/gdk/x11/gdkscreen-x11.c @@ -791,5 +791,149 @@ gdk_screen_make_display_name (GdkScreen *screen) gdk_screen_get_number (screen)); } +/** + * gdk_screen_get_active_window + * @screen: a #GdkScreen + * + * Returns the screen's currently active window. + * + * On X11, this is done by inspecting the _NET_ACTIVE_WINDOW property + * on the root window, as described in the Extended Window + * Manager Hints. If there is no currently currently active + * window, or the window manager does not support the + * _NET_ACTIVE_WINDOW hint, this function returns %NULL. + * + * On other platforms, this function may return %NULL, depending on whether + * it is implementable on that platform. + * + * The returned window should be unrefed using g_object_unref() when + * no longer needed. + * + * Return value: the currently active window, or %NULL. + * + * Since: 2.10 + **/ +GdkWindow * +gdk_screen_get_active_window (GdkScreen *screen) +{ + GdkScreenX11 *screen_x11; + GdkWindow *ret = NULL; + Atom type_return; + gint format_return; + gulong nitems_return; + gulong bytes_after_return; + guchar *data = NULL; + + g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL); + + if (!gdk_x11_screen_supports_net_wm_hint (screen, + gdk_atom_intern_static_string ("_NET_ACTIVE_WINDOW"))) + return NULL; + + screen_x11 = GDK_SCREEN_X11 (screen); + + if (XGetWindowProperty (screen_x11->xdisplay, screen_x11->xroot_window, + gdk_x11_get_xatom_by_name_for_display (screen_x11->display, + "_NET_ACTIVE_WINDOW"), + 0, 1, False, XA_WINDOW, &type_return, + &format_return, &nitems_return, + &bytes_after_return, &data) + == Success) + { + if ((type_return == XA_WINDOW) && (format_return == 32) && (data)) + { + GdkNativeWindow window = *(GdkNativeWindow *) data; + + if (window != None) + { + ret = gdk_window_foreign_new_for_display (screen_x11->display, + *(GdkNativeWindow *) data); + } + } + } + + if (data) + XFree (data); + + return ret; +} + +/** + * gdk_screen_get_window_stack + * @screen: a #GdkScreen + * + * Returns a #GList of #GdkWindows representing the current + * window stack. + * + * On X11, this is done by inspecting the _NET_CLIENT_LIST_STACKING + * property on the root window, as described in the Extended Window + * Manager Hints. If the window manager does not support the + * _NET_CLIENT_LIST_STACKING hint, this function returns %NULL. + * + * On other platforms, this function may return %NULL, depending on whether + * it is implementable on that platform. + * + * The returned list is newly allocated and owns references to the + * windows it contains, so it should be freed using g_list_free() and + * its windows unrefed using g_object_unref() when no longer needed. + * + * Return value: a list of #GdkWindows for the current window stack, + * or %NULL. + * + * Since: 2.10 + **/ +GList * +gdk_screen_get_window_stack (GdkScreen *screen) +{ + GdkScreenX11 *screen_x11; + GList *ret = NULL; + Atom type_return; + gint format_return; + gulong nitems_return; + gulong bytes_after_return; + guchar *data = NULL; + + g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL); + + if (!gdk_x11_screen_supports_net_wm_hint (screen, + gdk_atom_intern_static_string ("_NET_CLIENT_LIST_STACKING"))) + return NULL; + + screen_x11 = GDK_SCREEN_X11 (screen); + + if (XGetWindowProperty (screen_x11->xdisplay, screen_x11->xroot_window, + gdk_x11_get_xatom_by_name_for_display (screen_x11->display, + "_NET_CLIENT_LIST_STACKING"), + 0, G_MAXLONG, False, XA_WINDOW, &type_return, + &format_return, &nitems_return, + &bytes_after_return, &data) + == Success) + { + if ((type_return == XA_WINDOW) && (format_return == 32) && + (data) && (nitems_return > 0)) + { + GdkNativeWindow *stack = (GdkNativeWindow *) data; + GdkWindow *win; + int i; + + for (i = 0; i < nitems_return; i++) + { + win = gdk_window_foreign_new_for_display (screen_x11->display, + stack[i]); + + if (win != NULL) + ret = g_list_append (ret, win); + } + } + } + + if (data) + XFree (data); + + return ret; +} + #define __GDK_SCREEN_X11_C__ #include "gdkaliasdef.c" -- 2.30.2